package cn.ac.ict.fpevaluation.cluster.ap;

import cn.ac.ict.fpevaluation.bean.AtomTrajectoryBean;
import cn.ac.ict.fpevaluation.bean.StepBean;
import cn.ac.ict.fpevaluation.fastdtw.dtw.TimeWarpInfo;
import cn.ac.ict.fpevaluation.fastdtw.test.FastDTWTest;
import cn.ac.ict.fpevaluation.fastdtw.test.MagneticSample;
import cn.ac.ict.fpevaluation.fastdtw.timeseries.TimeSeriesPoint;
import cn.ac.ict.fpevaluation.utils.WifiHelper;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 分类的步骤:
 * APBasedDirections(对方向进行聚类)
 * |
 * AP(对路径进行聚类)
 *
 * @author WUyouxiong
 *         <p>
 *         经测试之后发现, 假设聚类结果是正确的,那么室内地磁会随着时间的变化有较大的变化
 */
public class APBasedWifi extends AP {

    public APBasedWifi(List<AtomTrajectoryBean> data) {
        super(data);
    }

    /**
     * 计算两条原子轨迹间的相似度
     *
     * @param data
     * @return
     */
    @Override
    protected double[][] calSimilarity(List<AtomTrajectoryBean> data) {
        int len = data.size();
        if (len == 0) return null;
        // 把AtomTrajectoryBean变成Sample集合

        double[][] result = new double[len][len];
        pa = new ArrayList<>();
        double distance = 0;
        for (int i = 0; i < len; i++) {
            for (int j = i; j < len; j++) {
                //3代表是3维向量
                //距离越小相似度越大
                distance = WifiHelper.calDtw(data.get(i).getAps(), data.get(j).getAps());
               // System.out.println("distance base WiFi: " + distance);
                result[i][j] = -distance;
                pa.add(result[i][j]);// 存储相似度，用于计算中值
                result[j][i] = result[i][j];// 相似度是对称的
            }
        }


        // 对角线上元素赋中值
        Collections.sort(pa);
        // System.out.println("MIN" + min);
        for (int i = 0; i < trajectoryNum; i++) {
            //result[i][i] = min;
            result[i][i] = calMidValue(pa);
        }

        return result;
    }

    /**
     * 启动聚类
     */
    @Override
    public List<List<AtomTrajectoryBean>> launch() {
        return super.launch();
    }


    @Override
    public String getName() {
        return getClass().getName();
    }
}